現在有個 remote repository 為 testRep
有兩個 RD 分別 從上面的 testRep clone 下來到自己的工作區內
RD name | local repository |
---|---|
momo | testRep1 |
kuro | testRep2 |
testRep1及testRep2的分支線圖如下
兩個RD同時開始開發不同的功能
這時候kuro做完了他的功能func001,將此功能commit並且Push到remote上了
kuro 異動了原本的 test1.txt
新增了新增了 test2.txt
因為沒人比kuro先commit及Push,因此很順利的就完成了整個作業流程
kuro的testRep2分支線圖如下
這時候remote repository的分支也是長這樣
kuro做完了func001並且Push後
通知momo說他完成了
此時momo的func002正寫到一半
momo寫一半的資料包含
momo 異動了原本的 test1.txt
新增了新增了 test3.txt
聽了kuro寫完func001後就想說把remote的資料Pull下來合併
這時候momo 先將寫一半的資料利用git add暫存到staged area
此時的testRep1分支線圖如下
接著
momo下了pull把remote的資料pull回來
$ git pull
Updating 0229011..f454e57
error: Your local changes to the following files would be overwritten by merge:
test.txt
Please, commit your changes or stash them before you can merge.
Aborting
這時候會發現,git提示說你有local change還沒commit或stash起來,可能會被pull作業給覆蓋掉
就沒繼續執行pull作業了
有兩種做法就是commit或stash
把現有的異動加到staged area 並且 commit
這個解法可以讓momo pull 下來remote的資料
不過不建議這麼做 因為會多一個做一半的commit
會對之後追蹤版本多增加一點困擾
commit一多 眼睛都花了
比較建議封存這個做法
我們可以先把改一半的異動封存到stash 1後
$ git add .
$ git stash save 'stash 1'
Saved working directory and index state On master: stash 1
HEAD is now at 0229011 merge form iss1 commit
查詢目前有哪些stash
$ git stash list
stash@{0}: On master: stash 1
再將remote的資料pull下來
$ git pull
Updating 0229011..f454e57
Fast-forward
test.txt | 5 ++++-
test2.txt | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
create mode 100644 test2.txt
之後再將stash的資料apply或pop回來
$ git stash pop stash@{0}
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
momo繼續開發
開發完成就可以commit後push了
會操作這段主要是因為有同事會發生code在還沒commit前,pull之後發現自己寫的進度不見了
但是自己驗證卻發現不論是下指令或是利用source tree這套工具
在本地端的異動還沒commit或stash的情況下,是無法完成pull作業的
所以到底哪種情況會導致開發進度被覆蓋呢?